home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlb20 / lib / bzero.cpp < prev    next >
C/C++ Source or Header  |  1992-05-17  |  3KB  |  125 lines

  1. #include <compiler.h>
  2. |    new version of bcopy and memset
  3. |    uses movem to set 256 bytes blocks faster.
  4. |    Alexander Lehmann    alexlehm@iti.informatik.th-darmstadt.de
  5. |    sortof inspired by jrbs bcopy
  6. |    has to be preprocessed (int parameter in memset)
  7.  
  8.     .text
  9.     .even
  10.     .globl _bzero
  11. #ifdef __MINT__
  12.     .globl __bzero
  13. #else
  14.     .globl _lbzero
  15. #endif
  16.     .globl _memset
  17.  
  18. |    void *memset( void *dest, int val, size_t len );
  19. |    returns dest
  20. |    two versions for 16/32 bits
  21.  
  22. _memset:
  23.     movl    sp@(4),a0    | dest
  24. #ifdef __MSHORT__
  25.     movb    sp@(9),d0    | value
  26.     movl    sp@(10),d1    | length
  27. #else
  28.     movb    sp@(11),d0    | value
  29.     movl    sp@(12),d1    | length
  30. #endif
  31.     jeq    exit        | length==0? (size_t)
  32.     jra    do_set
  33.  
  34. |    void bzero( void *dest, size_t length );
  35. |    void _bzero( void *dest, size_t length );
  36. |    return value not used (returns dest)
  37.  
  38. _bzero:
  39. #ifdef __MINT__
  40. __bzero:
  41. #else
  42. _lbzero:
  43. #endif
  44.     movl    sp@(4),a0    | dest
  45.     movl    sp@(8),d1    | length
  46.     jeq    exit        | length==0? (size_t)
  47.     clrb    d0        | value
  48.  
  49. do_set:             | a0 dest, d0.b byte, d1.l length
  50.     movel    d2,sp@-
  51.  
  52.     addl    d1,a0        | a0 points to end of area, needed for predec
  53.  
  54.     movw    a0,d2        | test for alignment
  55.     btst    #0,d2        | odd ?
  56.     jeq    even
  57.     movb    d0,a0@-     | set one byte, now we are even
  58.     subql    #1,d1
  59. even:
  60.     movb    d0,d2
  61.     lslw    #8,d0
  62.     movb    d2,d0
  63.     movw    d0,d2
  64.     swap    d2
  65.     movw    d0,d2        | d2 has byte now four times
  66.  
  67.     clrw    d0        | save length less 256
  68.     movb    d1,d0
  69.     lsrl    #8,d1        | number of 256 bytes blocks
  70.     jeq    less256
  71.     movml    d3-d7/a2-a6,sp@-    | d2 is already saved
  72.     movl    d2,d3
  73.     movl    d2,d4
  74.     movl    d2,d5
  75.     movl    d2,d6
  76.     movl    d2,d7
  77.     movl    d2,a2
  78.     movl    d2,a3
  79.     movl    d2,a4
  80.     movl    d2,a5
  81.     movl    d2,a6
  82. set256:
  83.     movml    d2-d7/a2-a6,a0@-    | set 5*44+36=256 bytes
  84.     movml    d2-d7/a2-a6,a0@-
  85.     movml    d2-d7/a2-a6,a0@-
  86.     movml    d2-d7/a2-a6,a0@-
  87.     movml    d2-d7/a2-a6,a0@-
  88.     movml    d2-d7/a2-a4,a0@-
  89.     subql    #1,d1
  90.     jne    set256            | next, please
  91.     movml    sp@+,d3-d7/a2-a6
  92. less256:            | set 16 bytes blocks
  93.     movw    d0,sp@-     | save length below 256 for last 3 bytes
  94.     lsrw    #2,d0        | number of 4 bytes blocks
  95.     jeq    less4        | less that 4 bytes left
  96.     movw    d0,d1
  97.     negw    d1
  98.     andw    #3,d1        | d1 = number of bytes below 16 (-n)&3
  99.     subqw    #1,d0
  100.     lsrw    #2,d0        | number of 16 bytes blocks minus 1, if d1==0
  101.     addw    d1,d1        | offset in code (movl two bytes)
  102.     jmp    pc@(2,d1:w)    | jmp into loop
  103. set16:
  104.     movl    d2,a0@-
  105.     movl    d2,a0@-
  106.     movl    d2,a0@-
  107.     movl    d2,a0@-
  108.     dbra    d0,set16
  109. less4:
  110.     movw    sp@+,d0
  111.     btst    #1,d0
  112.     jeq    less2
  113.     movw    d2,a0@-
  114. less2:
  115.     btst    #0,d0
  116.     jeq    none
  117.     movb    d2,a0@-
  118. none:
  119. exit_d2:
  120.     movl    sp@+,d2
  121. exit:
  122.     movl sp@(4),d0        | return dest (for memset only)
  123.     rts
  124.  
  125.